﻿#include <iostream>
#include<vector>
using namespace std;

//int main()
//{
//	int n;
//	int h;
//	cin >> n;
//	vector<int>next(n+1);
//	for (int i = 1; i <= n; i++)
//	{
//		cin >> next[i];
//	}
//	cin >> h;
//	for (int i = h; i != 0; i = next[i])
//	{
//		cout << i << " ";
//	}
//   return 0;
//}

//const int N = 1e6 + 10;
//
//int h, id, e[N], ne[N];
//int mp[N];
//
//int main()
//{
//	int q; cin >> q;
//	
//	id++;
//	ne[id] = 1;
//	mp[1] = id;
//	while (q--)
//	{
//		int op, x, y;
//		cin >> op >> x;
//
//		int p = mp[x];
//
//		if (op == 1)
//		{
//			cin >> y;
//
//			id++;
//			e[id] = y;
//			ne[id] = ne[p];
//			ne[p] = id;
//			mp[y] = id;
//		}
//		else if (op == 2)
//		{
//			cout << e[ne[p]] << endl;
//		}
//		else if (op == 3)
//		{
//
//			ne[p] = ne[ne[p]];
//		}
//	}
//	return 0;
//}

//const int N = 1e5 + 10;
//int h; // 头指针
//int id; // 下⼀个元素分配的位置
//int e[N], ne[N]; // 数据域和指针域
//
//void push_front(int x)// 头插
//{
//	id++;
//	e[id] = x;
//	ne[id] = ne[h];
//	ne[h] = id;
//
//
//}
//
//void print(int head)
//{
//
//	for (int i = ne[head]; i; i = ne[i])
//	{
//
//		cout << e[i]<<endl;
//	}
//}
//
//int main()
//{
//
//
//}

//#include<iostream>
//#include<unordered_map>
//using namespace std;
//
//unordered_map<string, int>mp;
//int n;
//int main()
//{
//	cin >> n;
//	while (n--)
//	{
//		int op; string name;
//		int score;
//		cin >> op;
//		if (op == 1)
//		{
//			cin >> name >> score;
//			mp[name] = score;
//			cout << "OK" << endl;
//		}
//		else if (op == 2)
//		{
//			cin >> name;
//			if (mp.count(name))cout << mp[name] << endl;
//			else cout << "Not found" << endl;
//		}
//		else if (op == 3)
//		{
//			cin >> name;
//			if (mp.count(name))
//			{
//				mp.erase(name);
//				cout << "Deleted successfully" << endl;
//			}
//			else cout << "Not found" << endl;
//
//		}
//		else
//		{
//			cout << mp.size() << endl;
//		}
//	}
//
//	return 0;
//}

//#include<unordered_set>
//#include<iostream>
//using namespace std;
//int main()
//{
//	int T;
//	scanf("%d", &T);
//
//	while (T--)
//	{
//		int n; 
//		//cin >> n;
//		scanf("%d", &n);
//		unordered_set<int>mp;
//
//		for (int i = 1; i <= n; i++)
//		{
//			int x; 
//			//cin >> n;
//			scanf("%d", &x);
//
//			if (!mp.count(x))
//			{
//				printf("%d ", x);
//				mp.insert(x);
//			}
//		}
//		cout << endl;
//	}
//	return 0;
//}

//#include <iostream>
//#include<vector>
//#include<string>
//using namespace std;
//
//int n;
//string path;
//
//void dfs(int pos)
//{
//	if (pos > n)
//	{
//		cout << path << endl;
//		return;
//	}
//	// // 不选
//	path += 'N';
//	dfs(pos + 1);
//	path.pop_back();
//
//	// // 选
//	path += 'Y';
//	dfs(pos + 1);
//	path.pop_back();
//}
//
//
//int main()
//{
//	int n;
//	cin >> n;
//	dfs(1);
//	return 0;
//}


#include <iostream>
#include<vector>
using namespace std;
vector<int>arr;
int m, n;
void dfs(int pos)
{

	if (arr.size() == m)
	{
		for (auto x : arr) cout << x << " ";
		cout << endl;
		return;
	}

	for (int i = 1; i <= n; i++)
	{
		arr.push_back(i);
		dfs(pos + 1);
		arr.pop_back();
	}

}

int main()
{
	cin >> n >> m;
	dfs(1);

	return 0;
}





